package com.fansl.koala.quickdev.module.users.controller;


import cn.hutool.core.bean.BeanUtil;
import com.fansl.koala.quickdev.common.bean.PageBean;
import com.fansl.koala.quickdev.common.bean.R;
import com.fansl.koala.quickdev.module.users.bean.dto.SysDeptDTO;
import com.fansl.koala.quickdev.module.users.entity.SysDept;
import com.fansl.koala.quickdev.module.users.service.ISysDeptService;
import com.fansl.koala.quickdev.module.users.vo.DeptTreeVo;
import com.fansl.koala.quickdev.module.users.vo.SimpleTreeVo;
import com.fansl.koala.quickdev.module.users.vo.SysDeptVo;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;

import java.util.List;

/**
 * <p>
 * 部门管理 前端控制器
 * </p>
 *
 * @author fansl
 * @since 2020-03-23
 */
@RestController
@AllArgsConstructor
@RequestMapping("/users/sys-dept")
public class SysDeptController {
    private final ISysDeptService sysDeptService;

    /**
     * 添加
     *
     * @param sysDeptDTO 参数
     * @return true/false
     */
    @PostMapping("")
    public Mono<R<Boolean>> add(@RequestBody SysDeptDTO sysDeptDTO) {
        SysDept sysDept = sysDeptDTO2Bean(sysDeptDTO);
        sysDept.setDeptId(null);
        boolean b = sysDeptService.save(sysDept);
        return Mono.just(R.ok(b));
    }

    /**
     * 根据主键更新
     *
     * @param sysDeptDTO 参数
     * @return true/false
     */
    @PutMapping("")
    public Mono<R<Boolean>> updateById(@RequestBody SysDeptDTO sysDeptDTO) {
        SysDept sysDept = sysDeptDTO2Bean(sysDeptDTO);
        boolean b = sysDeptService.updateById(sysDept);
        return Mono.just(R.ok(b));
    }

    /**
     * 根据主键获取信息
     *
     * @param id 主键
     * @return 查询数据
     */
    @GetMapping("/{id}")
    public Mono<R<SysDeptVo>> getById(@PathVariable Long id) {
        SysDept sysDept = sysDeptService.getById(id);
        SysDeptVo sysDeptVo = sysDept2Vo(sysDept);
        return Mono.just(R.ok(sysDeptVo));
    }

    /**
     * 根据主键删除
     *
     * @param id 主键
     * @return true/false
     */
    @DeleteMapping("/{id}")
    public Mono<R<Boolean>> delById(@PathVariable Long id) {
        boolean b = sysDeptService.removeById(id);
        return Mono.just(R.ok(b));
    }

    /**
     * 分页查询
     *
     * @param page    分页询参数
     * @param sysDept 查询参数
     * @return 查询数据
     */
    @GetMapping("/page")
    public Mono<R<PageBean<DeptTreeVo>>> pageDeptTree(PageBean<DeptTreeVo> page, SysDept sysDept) {
        //查询
        PageBean<DeptTreeVo> result = sysDeptService.pageDeptTree(page, sysDept);
        //转换结果
        return Mono.just(R.ok(result));
    }

    @GetMapping("/tree/list")
    public Mono<R<List<SimpleTreeVo>>> treeList() {
        List<SimpleTreeVo> sysDeptVos = sysDeptService.getTreeList();
        return Mono.just(R.ok(sysDeptVos));
    }

    /**
     * Vo对象转换
     *
     * @param sysDept 源对象
     * @return 目标对象
     */
    private SysDeptVo sysDept2Vo(SysDept sysDept) {
        SysDeptVo target = new SysDeptVo();
        BeanUtil.copyProperties(sysDept, target);
        return target;
    }

    /**
     * Po对象转换
     *
     * @param sysDeptDTO 源对象
     * @return 目标对象
     */
    private SysDept sysDeptDTO2Bean(SysDeptDTO sysDeptDTO) {
        SysDept target = new SysDept();
        BeanUtil.copyProperties(sysDeptDTO, target);
        return target;
    }
}
